package com.yuan.algorithms.practice201503;

/*
 Problem Description
 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,
 但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体. 
 Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,
 将一个B(ball)变成一个M(Mouse)
 Input
 测试数据有多组。每组有多行，每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.
 Output
 如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)
 Sample Input
 so
 soon
 river
 goes
 them
 got
 moon
 begin
 big
 0
 Sample Output
 Yes.
 */

import java.util.Scanner;

public class 字符查找跟踪_变形课 {

	static char[][] x;
	static boolean mark;//标记是否可以转换
	static boolean[] q;
	static boolean result;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			mark = false;
			result = false;
			int num = 0;// 单词数
			int j = 0, k = 0;
			x = new char[1000][2];
			while (true) {
				String n = sc.next();
				if (n.equals("0")) {
					break;
				}
				x[j][k++] = n.charAt(0);
				x[j++][k--] = n.charAt(n.length() - 1);
				num++;
			}
			q = new boolean[num+1];
			for (int i = 0; i < num; i++) {
				if (x[i][1] == 'm') {
					f(i, num);
				}
			}
			if (!mark) {
				System.out.println("No.");
			}
		}
	}

	private static void f(int i, int num) {
		if (x[i][0] == 'b' && !result) {
			System.out.println("Yes.");
			mark = true;
			result = true;
			return;
		}
		for (int k = 0; k < num; k++) {
			if (x[k][1] == x[i][0] && !q[k]) {
				q[k] = true; 
				f(k, num);
				q[k] = false; 
			}
		}
	}

}
